package top.toptimus.util;

import org.apache.commons.lang3.StringUtils;

/**
 * 字符串中提取数字工具类
 */
public class StrNumberUtil {
    /**
     * 把字符串数字类型的数字取出来（只取遇到非数字字符前，包括空格）
     *
     * @param str <li>"1-0我5013我24a5c6"    》 1</li>
     *            <li>"10  5 013我24a 5c6"  》 10</li>
     *            <li>"105013我24a5c6"      》 105013</li>
     *            <li>"000"                 》 000</li>
     *            <li>"00010123600"         》 00010123600</li>
     *            <li>"好20我1a2b"           》  空字符串</li>
     * @return 数字
     */
    public static String getPrefixNumberText(String str) {
        if (StringUtils.isBlank(str)) {
            throw new RuntimeException("参数str不能为空");
        }
        StringBuilder number = new StringBuilder("");

        String[] strArray = str.split("");
        for (int i = 1; i < strArray.length; i++) {
            if (RegUtils.isNumberText(strArray[i])) {
                number.append(strArray[i]);
            } else {
                break;
            }
        }
        return number.toString();
    }


    /**
     * 把字符串数字类型的数字取出来（只取遇到非数字字符前，但不包括空格）
     *
     * @param str <li>"1-0我5013我24a5c6"    》 1</li>
     *            <li>"10  5 013我24a 5c6"  》 105013</li>
     *            <li>"105013我24a5c6"      》 105013</li>
     *            <li>"000"                 》 000</li>
     *            <li>"00010123600"         》 00010123600</li>
     *            <li>"00010123我600"        》 00010123</li>
     * @return 数字
     */
    public static String getPrefixNumberTextIgnoreSpace(String str) {
        if (StringUtils.isBlank(str)) {
            throw new RuntimeException("参数str不能为空");
        }
        StringBuilder number = new StringBuilder("");

        String[] strArray = str.split("");
        for (String string : strArray) {
            if (!StringUtils.isBlank(string)) {
                if (RegUtils.isNumberText(string)) {
                    number.append(string);
                } else {
                    break;
                }
            }
        }
        return number.toString();
    }


    /**
     * 把字符串数字类型的所有数字取出来
     *
     * @param str <li>"1-000我10123我60#0"       》 100010123600</li>
     *            <li>"00010-+123我600"         》 00010123600</li>
     *            <li>"我是2019我600"            》 2019600</li>
     *            <li>"我是20 -19我    600"         》 2019600</li>
     * @return 数字
     */
    public static String getNumberText(String str) {
        if (StringUtils.isBlank(str)) {
            throw new RuntimeException("参数str不能为空");
        }
        StringBuilder number = new StringBuilder("");

        String[] strArray = str.split("");
        for (String string : strArray) {
            if (!StringUtils.isBlank(string) && RegUtils.isNumberText(string)) {
                number.append(string);
            }
        }
        return number.toString();
    }


    /**
     * 把字符串数字类型的数字取出来（只取遇到非数字字符前，不包括空格）转换成数字
     *
     * @param str <li>"1-0我5013我24a5c6"    》 1</li>
     *            <li>"10  5 013我24a 5c6"  》 105013</li>
     *            <li>"105013我24a5c6"      》 105013</li>
     *            <li>"000"                 》 0</li>
     *            <li>"00010123600"         》 10123600</li>
     * @return 数字
     */
    public static long getPrefixNumber(String str) {
        String number = getPrefixNumberTextIgnoreSpace(str);
        if (StringUtils.isBlank(number)) {
            return 0;
        }

        //去掉前面为0的，如0099变成99
        String[] texts = number.split("");
        StringBuilder numbers = new StringBuilder("");
        for (String text : texts) {
            if (numbers.length() < 1) {
                if (text.equals("0")) {
                    continue;
                }
            }
            numbers.append(text);
        }

        if (numbers.length() < 1) {
            return 0;
        }
        return Long.parseLong(numbers.toString());
    }


    /**
     * 把字符串数字类型的数字取出来转换成数字
     *
     * @param str <li>"1-000我10123我60#0"   》 100010123600</li>
     *            <li>"00010-+123我600"      》 10123600</li>
     *            <li>"我是2019我600"         》 2019600</li>
     *            <li>"我是20 -19我    600"     》 2019600</li>
     * @return 数字
     */
    public static long getNumber(String str) {
        String number = getNumberText(str);
        if (StringUtils.isBlank(number)) {
            return 0;
        }

        //去掉前面为0的，如0099变成99
        String[] texts = number.split("");
        StringBuilder numbers = new StringBuilder("");
        for (String text : texts) {
            if (numbers.length() < 1) {
                if (text.equals("0")) {
                    continue;
                }
            }
            numbers.append(text);
        }

        if (numbers.length() < 1) {
            return 0;
        }
        return Long.parseLong(numbers.toString());
    }
}
